package com.bbva.gptf.back.dominio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.TypedQuery;

import org.apache.commons.lang.StringUtils;
import org.springframework.roo.addon.dbre.RooDbManaged;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;

@RooJavaBean
@RooToString
@RooDbManaged(automaticallyDelete = true)
@RooEntity(versionField = "", table = "TGPT011_USUARIO", schema = "DBSGPT", finders = { "findTgpt011UsuariosByCdBancomerEquals" })
public class Tgpt011Usuario {

	public static List<Tgpt011Usuario> buscaUsuarioUpperCase(
			final String cdBancomer) {
		if (StringUtils.isBlank(cdBancomer)) {
			return null;
		}
		try {

			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt011Usuario usr ");
			qlString.append("WHERE UPPER(usr.cdBancomer) = :cdBancomer");

			return entityManager()
					.createQuery(qlString.toString(), Tgpt011Usuario.class)
					.setParameter("cdBancomer", cdBancomer.toUpperCase())
					.getResultList();

		} catch (final Exception e) {

		}
		return null;
	}

	public static Boolean eliminaUsuario(final BigDecimal cdUsuario) {
		if (cdUsuario == null) {
			return false;
		}

		try {
			final StringBuffer qlString = new StringBuffer("DELETE FROM ");
			qlString.append("com.bbva.gptf.back.dominio.Tgpt011Usuario u ");
			qlString.append("where u.cdUsuario = :cdUsuario");

			entityManager().createQuery(qlString.toString())
					.setParameter("cdUsuario", cdUsuario).executeUpdate();
		} catch (final Exception e) {
			e.printStackTrace();
			return false;
		}

		return true;
	}

	public static Tgpt011Usuario obtieneUsuarioByCdBancomer(
			final String cdBancomer) {
		try {
			final TypedQuery<Tgpt011Usuario> query = Tgpt011Usuario
					.findTgpt011UsuariosByCdBancomerEquals(cdBancomer);
			final List<Tgpt011Usuario> lista = query.getResultList();
			if (lista == null || lista.isEmpty()) {
				return null;
			}
			return lista.get(0);
		} catch (final Exception ex) {
			return null;
		}
	}

	public static List<Tgpt011Usuario> obtieneUsuariosSinMancuerna(
			final BigDecimal cdGrupoPerfil, final BigDecimal cdUsuario) {
		try {

			if (cdGrupoPerfil == null || cdUsuario == null) {
				return new ArrayList<Tgpt011Usuario>();
			}

			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt011Usuario usr ");
			qlString.append("WHERE usr.cdPerfil.cdGrupoPerfil.cdGrupoPerfil = :cdGrupoPerfil ");
			qlString.append("AND usr.cdUsuario not in (");
			qlString.append("SELECT g.cdMancuerna FROM Tgpt012Gestor g ");
			qlString.append("WHERE NOT g.cdMancuerna IS NULL) ");
			qlString.append("AND NOT usr.cdUsuario = :cdUsuario");

			return entityManager()
					.createQuery(qlString.toString(), Tgpt011Usuario.class)
					.setParameter("cdGrupoPerfil", cdGrupoPerfil)
					.setParameter("cdUsuario", cdUsuario).getResultList();
		} catch (final Exception e) {
			// TODO: handle exception
		}
		return new ArrayList<Tgpt011Usuario>();
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_usuario")
	@SequenceGenerator(name = "sq_usuario", sequenceName = "SQ_USUARIO")
	@Column(name = "CD_USUARIO")
	private BigDecimal cdUsuario;
}
